home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / formats / iff / newiff.lzh / NewIFF / NewIFF.lzh / newiff / modules / screendump.c < prev    next >
C/C++ Source or Header  |  1992-05-18  |  3KB  |  96 lines

  1. /*
  2.  * screendump.c    - routine to dump rastport (iffparse not required)
  3.  *
  4.  */
  5. #define INTUI_V36_NAMES_ONLY
  6.  
  7. #include <exec/types.h>
  8. #include <intuition/screens.h>
  9. #include <devices/printer.h>
  10.  
  11. #ifndef NO_PROTOS
  12. #include <clib/exec_protos.h>
  13. #include <clib/alib_protos.h>
  14. #endif
  15.  
  16.  
  17. /* screendump
  18.  * 
  19.  * Passed a screen pointer, source x, source y, width, height,
  20.  *   destcols and io_Special flags, will print part or all of a screen.
  21.  *
  22.  * If 0 is passed for BOTH destcols and special, screendump()
  23.  *   assumes you want IT to compute suitable values.
  24.  * In this case:
  25.  *   1. If srcx and srcy are 0, and srcw and srch are same as
  26.  *      screen width and height, screendump will set destcols=0,
  27.  *      and special = SPECIAL_FULLCOLS|SPECIAL_ASPECT
  28.  *    for a full width aspected dump.
  29.  *
  30.  *   2. If srcx or srcy are nonzero, or srcw or srch are different
  31.  *      from screen width or height, screendump will print a
  32.  *      fractional size dump relative to the size whole screendump
  33.  *      would have been.
  34.  *
  35.  * Returns 0 for success or printer io_Error (devices/printer.h)
  36.  */
  37.  
  38. int screendump(struct Screen *scr,
  39.         UWORD srcx, UWORD srcy, UWORD srcw, UWORD srch,
  40.         LONG destcols, UWORD iospecial)
  41.     {
  42.     struct IODRPReq *iodrp;
  43.     struct MsgPort  *printerPort;
  44.     struct ViewPort *vp;
  45.     ULONG tmpl;
  46.     int error = PDERR_BADDIMENSION;
  47.  
  48.     if(!scr)    return(error);
  49.  
  50.     if((!destcols)&&(!iospecial))
  51.     {
  52.     /* Then we compute what they should be */
  53.     if((!srcx)&&(!srcy)&&(srcw==scr->Width)&&(srch==scr->Height))
  54.         {
  55.         iospecial = SPECIAL_FULLCOLS|SPECIAL_ASPECT;
  56.         }
  57.     else
  58.         {
  59.         iospecial = SPECIAL_FRACCOLS|SPECIAL_ASPECT;
  60.         tmpl = srcw;
  61.         tmpl = tmpl << 16;
  62.         destcols = (tmpl / scr->Width) << 16;
  63.         }
  64.     }
  65.  
  66.     if(printerPort = CreatePort(0,0))
  67.     {
  68.     if(iodrp=
  69.        (struct IODRPReq *)CreateExtIO(printerPort,sizeof(struct IODRPReq)))
  70.         {
  71.         if(!(error=OpenDevice("printer.device",0,iodrp,0)))
  72.         {
  73.                 vp = &scr->ViewPort;
  74.                 iodrp->io_Command = PRD_DUMPRPORT;
  75.                 iodrp->io_RastPort = &scr->RastPort;
  76.                 iodrp->io_ColorMap = vp->ColorMap;
  77.                 iodrp->io_Modes = (ULONG)vp->Modes;
  78.              iodrp->io_SrcX = srcx;
  79.             iodrp->io_SrcY = srcy;
  80.                 iodrp->io_SrcWidth = srcw;
  81.                 iodrp->io_SrcHeight = srch;
  82.             iodrp->io_DestCols = destcols;
  83.     /*      iodrp->io_DestRows = 0; cleared by allocation */
  84.                 iodrp->io_Special = iospecial;
  85.  
  86.                 error = DoIO(iodrp);
  87.  
  88.                 CloseDevice(iodrp);
  89.                 }
  90.         DeleteExtIO(iodrp);
  91.           }
  92.           DeletePort(printerPort);
  93.           }
  94.     return(error);
  95.     }
  96.